home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks97
/
WarriorsProgress.sit
/
Warrior’s Progress
/
source code
/
Source
/
Libraries
/
Integers
/
Range.h
< prev
next >
Wrap
Text File
|
1997-06-28
|
3KB
|
84 lines
// Range.h
#ifndef Range_h
#define Range_h
#ifndef Assert_h
#include "Assert.h"
#endif
template < class Value >
class Range
{
typedef Range<Value> RangeType;
private:
Value start;
Value end;
public:
Range( Value v ) : start( v ), end( v ) {}
Range( Value s, Value e ) : start( s ), end( e ) { Assert( s <= e ); }
const Value& Start() const { return start; }
const Value& End() const { return end; }
Value Length() const { return end - start; }
void SetStart( Value v ) { Assert( v <= end ); start = v; }
void SetEnd( Value v ) { Assert( start <= v ); end = v; }
bool IsEmpty() const { return start >= end; }
bool Contains( Value v ) const { return start <= v && v < end; }
bool StrictlyContains( Value v ) const { return start < v && v < end; }
bool WeaklyContains( Value v ) const { return start <= v && v <= end; }
bool ReverseContains( Value v ) const { return start < v && v <= end; }
RangeType Head( Value middle ) const { Assert( middle <= end ); return RangeType( start, middle ); }
RangeType Tail( Value middle ) const { Assert( start <= middle ); return RangeType( middle, end ); }
RangeType Middle( Value s, Value e ) const { Assert( start <= s ); Assert ( e <= end ); return RangeType( s,e ); }
bool IsHeadOf( const RangeType& r ) const { return start == r.start && end <= r.end; }
bool IsTailOf( const RangeType& r ) const { return start >= r.start && end == r.end; }
void RemoveHead( Value v ) { Assert( start <= v ); Assert( v <= end ); start = v; }
void RemoveTail( Value v ) { Assert( start <= v ); Assert( v <= end ); end = v; }
void AddHead( Value v ) { Assert( v <= start ); start = v; }
void AddTail( Value v ) { Assert( end <= v ); end = v; }
void RemoveHead( const RangeType& r ) { Assert( start == r.start ); Assert( r.end <= end ); start = r.end; }
void RemoveTail( const RangeType& r ) { Assert( start <= r.start ); Assert( r.end == end ); end = r.start; }
void AddHead( const RangeType& r ) { Assert( start == r.end ); start = r.start; }
void AddTail( const RangeType& r ) { Assert( end == r.start ); end = r.end; }
// These operators order ranges by containment
bool operator==( const RangeType& r ) const { return start == r.start && end == r.end; }
bool operator!=( const RangeType& r ) const { return start != r.start || end != r.end; }
bool operator>=( const RangeType& r ) const { return start <= r.start && end >= r.end; }
bool operator<=( const RangeType& r ) const { return start >= r.start && end <= r.end; }
bool operator<( const RangeType& r ) const { return *this <= r && *this != r; }
bool operator>( const RangeType& r ) const { return *this >= r && *this != r; }
void operator&=( const RangeType& r ); // intersection
void operator|=( const RangeType& r ); // union
RangeType operator&( const RangeType& r ) const;
RangeType operator|( const RangeType& r ) const;
void ExtendToContain( Value v );
void ExtendToWeaklyContain( Value v );
void ExtendToStrictlyContain( Value v );
void ExtendToReverseContain( Value v );
};
typedef Range<int8> Range8;
typedef Range<uint8> URange8;
typedef Range<int16> Range16;
typedef Range<uint16> URange16;
typedef Range<int32> Range32;
typedef Range<uint32> URange32;
#endif